package com.cskaoyan.javase.oop3._1interface._4example.dao.impl;

import com.cskaoyan.javase.oop3._1interface._4example.dao.IGoodsOperationDao;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;
import com.cskaoyan.javase.oop3._1interface._4example.model.GoodsData;

/**
 * 该类的对象提供对外的数据处理操作
 * 该层需要直接和数据源交互
 *
 * @since 11:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsOperationDaoImpl implements IGoodsOperationDao {

    private Goods[] sourceData = GoodsData.GOODS_DATA;

    /**
     * 该方法进行数据处理,将仅装有商品对象的数组返回
     * @return com.cskaoyan.javase.oop3._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 11:20
     */
    @Override
    public Goods[] getAllRealGoods() {
        // 1.统计数据源中null元素的个数,然后创建新数组
        int count = 0;
        for (Goods data : sourceData) {
            if (data == null) {
                count++;
            }
        }
        Goods[] result = new Goods[sourceData.length - count];
        // 2.给新数组赋值
        int index = 0;
        for (Goods data : sourceData) {
            if (data == null) {
                continue;
            }
            // 不是null元素就赋值给新数组
            result[index] = data;
            index++;
        }
        return result;
    }

    /**
     * 校验id是否存在,如果存在返回true,如果不存在返回false
     * @param id 被校验的id
     * @return
     */
    @Override
    public boolean judgeIdExist(int id) {
        // 遍历数据源,查找id是否存在,这时需要注意要判null,避免空指针异常
        /*for (Goods data : sourceData) {
            if (data == null) {
                continue;
            }
            if (data.getId() == id) {
                // 存在,重复
                return true;
            }
        }*/

        // 遍历getAllRealGoods方法的结果,省了判null的过程
        for (Goods realData : getAllRealGoods()) {
            if (realData.getId() == id) {
                // 存在,重复
                return true;
            }
        }
        // 不存在,不重复
        return false;
    }

    /**
     * 找到一个数据源数组的null位置,将一个新的商品对象插入
     * 注意这时的商品对象id一定是不重复的
     * 返回值:
     *      true 表示插入失败,数组满了
     *      false 表示插入成功
     *
     * @param goodsInsert 被插入的id不重复的商品对象
     * @return
     */
    @Override
    public boolean insertGoodsIdNotRepeat(Goods goodsInsert) {
        // 将对象插入数据源数组,遍历老数组找到一个null的位置,然后赋值
        for (int i = 0; i < sourceData.length; i++) {
            if (sourceData[i] == null) {
                sourceData[i] = goodsInsert;
                return false;
            }
        }
        // 数组满了,插入失败!\
        return true;
    }

}
